package com.team2.outpatient_sys.dao;

import com.team2.outpatient_sys.pojo.Department;
import com.team2.outpatient_sys.pojo.DepartmentAndDoctors;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface DepartmentDao {
    /**
     * 添加新的科室信息
     * @param department 添加的科室信息的封装对象
     * @return 添加新的科室信息影响的表数据行数
     */
    @Insert("INSERT INTO `department` VALUES(null, #{name}, #{prefix})")
    int insertNew(Department department);

    /**
     * 修改表中的某一条科室信息
     * 需要提供一个完整的科室信息封装对象，根据其中的id属性值修改对应的科室信息
     * @param department 修改的科室信息的封装对象
     * @return 修改科室信息所影响的表数据行数
     */
    @Update("UPDATE `department` SET `name`=#{name}, `prefix`=#{prefix} WHERE `id`=#{id}")
    int updateByWhole(Department department);

    /**
     * 根据id主键删除每一行科室信息
     * @param id 需要删除的科室信息的id字段值
     * @return 删除科室信息所影响的表数据行数
     */
    @Delete("DELETE FROM `department` WHERE `id`=#{id}")
    int deleteById(Integer id);

    /**
     * 查询所有科室信息
     * @return 查询到的科室信息封装对象Department的集合
     */
    @Select("SELECT * FROM `department`")
    List<Department> queryAll();

    /**
     * 根据id主键查询某一科室信息
     * @param id 查询科室信息需要的id字段值
     * @return 查询到的科室信息封装对象Department
     */
    @Select("SELECT * FROM `department` WHERE `id`=#{id}")
    Department queryById(Integer id);

    /**
     * 根据科室的主键id字段，查询科室信息，并查询出当前科室下所有的医生的信息
     * @param id 需要查询的科室的id字段值
     * @return 查询出的科室信息 及 当前科室下所有医生信息集合 的封装对象DepartmentAndDoctors
     */
    @Results({
            @Result(id = true, property = "id", column = "id"),
            @Result(property = "name", column = "name"),
            @Result(property = "prefix", column = "prefix"),
            @Result(property = "doctors", column = "id",
                    many = @Many(select = "com.team2.outpatient_sys.dao.DoctorDao.queryByDeptId"))
    })
    @Select("SELECT * FROM `department` WHERE `id`=#{id}")
    DepartmentAndDoctors queryDeptAndDoctors(Integer id);
}
